def genItemUsedDay(ruleDatum, ruleAct, filterDatum, hsp_abbr):

    # 从filterDatum获得 value
    value = filterDatum['value']

    # 从filterDatum获得 operator
    operator = filterDatum['operator']
    operSql = ""
    if operator == 'gt':
        operSql = ">"
    elif operator == 'lt':
        operSql = "<"
    elif operator == 'eq':
        operSql = "="
    elif operator == 'gte':
        operSql = ">="
    elif operator == 'lte':
        operSql = "<="
    
    # 从filterDatum获得 in_one_
    inOne = filterDatum.get('in_one_', 'case')
    if inOne == 'case':
        groupbySql = "setl_id"
        joinSql = "va.setl_id = vb.setl_id"
        joinSqlRi = "va.setl_id = ri.setl_id"
    elif inOne == 'year':
        groupbySql = "hsp_abbr, psn_no, j_year"
        joinSql = "va.hsp_abbr = vb.hsp_abbr AND va.psn_no = vb.psn_no AND va.j_year = vb.j_year"
        joinSqlRi = "va.hsp_abbr = ri.hsp_abbr AND va.psn_no = ri.psn_no AND va.j_year = ri.j_year"
    elif inOne == 'patient':
        groupbySql = "hsp_abbr, psn_no"
        joinSql = "va.hsp_abbr = vb.hsp_abbr AND va.psn_no = vb.psn_no"
        joinSqlRi = "va.hsp_abbr = ri.hsp_abbr AND va.psn_no = ri.psn_no"

    """
    ============ 思路 ============
    1. 统计 va 的每个 setl_id 的每个 item_j_code，出现了多少个不同的 item_day，插入 vb，删除不违规的部分
    2. va 删除不在 vb 中的数据
    3. va 计算 accu_day，通过 setl_id, item_j_code 分类，item_day 升序排序，计算 item_day 的排名 dense_rank
    4. 计算 vlt_q
        a. 如果 operator 是大于，则 accu_day > value 的部分就是违规的，将这一部分的 q 赋值给 vlt_q
        b. 如果 operator 是小于，则 accu_day < value 的部分就是违规的，将这一部分的 q 赋值给 vlt_q
    5. 更新 related，病例内已使用

    参数
    ● operator：大于，小于，等于
    ● value：数字
    ● in_one_: case, year, patient
    """
    
    sqlList = [
        # 清空临时表
        "TRUNCATE TABLE vlt_tmp_b",
        # step1, 统计 va 的每个 groupbySql 的每个 item_j_code，出现了多少个不同的 item_day，插入 vb，删除不违规的部分
        f"""
            -- item used day，step1，统计 va 的每个 groupbySql 的每个 item_j_code，出现了多少个不同的 item_day，插入 vb，删除不违规的部分
            INSERT INTO vlt_tmp_b vb ({groupbySql}, item_j_code, used_day_count)
            SELECT 
                {groupbySql}, 
                item_j_code, 
                COUNT(DISTINCT item_day) AS used_day_count
            FROM vlt_tmp_a va
            GROUP BY {groupbySql}, item_j_code
            HAVING COUNT(DISTINCT item_day) {operSql} {value}
        """,
        # step2, va 删除不在 vb 中的数据
        f"""
            -- item used day，step2，va 删除不在 vb 中的数据
            DELETE FROM vlt_tmp_a va
            WHERE NOT EXISTS (
                SELECT 1
                FROM vlt_tmp_b vb
                WHERE {joinSql}
                  AND va.item_j_code = vb.item_j_code
            )
        """,
        # step3, va 计算 accu_day，通过 {groupbySql}, item_j_code 分类，item_day 升序排序，计算 item_day 的排名 dense_rank
        f"""
            -- item used day，step3，va 计算 accu_day，通过 groupbySql, item_j_code 分类，item_day 升序排序，计算 item_day 的排名 dense_rank
            MERGE INTO vlt_tmp_a va
            USING (
                SELECT 
                    d0_rowid,
                    {groupbySql},
                    item_j_code, 
                    item_day,
                    DENSE_RANK() OVER (PARTITION BY {groupbySql}, item_j_code ORDER BY item_day) AS accu_day
                FROM vlt_tmp_a
            ) ri
            ON (va.d0_rowid = ri.d0_rowid)
            WHEN MATCHED THEN
            UPDATE SET va.accu_day = ri.accu_day
        """,
        # step4, 计算 vlt_q
        f"""
            -- item used day，step4，计算 vlt_q
            UPDATE vlt_tmp_a va
            SET vlt_q = CASE 
                WHEN va.accu_day {operSql} {value} THEN va.q
                ELSE 0
            END
        """,
    ]
    
    return sqlList
